﻿// Jinx AJAX Framework
// Copyright (C) 2008 Blake Hegerle
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

using Jinx.Applications;
using Jinx.Models;
using Jinx.Naming;
using System;

namespace Jinx
{
    public sealed class App
    {
        public static ApplicationContext Context
        {
            get { return ThreadToApplicationContextAssociation.ApplicationContext; }
        }

        public static NamingContext NamingContext
        {
            get { return Context.BindingContext.NamingContext; }
        }

        public static T New<T>() where T : class
        {
            return NamingContext.New<T>();
        }

        public static T New<T>(Action<T> Cons) where T : class
        {
            var New = NamingContext.New<T>();

            Cons(New);

            return New;
        }

        public static T New<T>(string ModelName) where T : class
        {
            return NamingContext.NameNew<T>(ModelName);
        }

        public static ProxyModel<T> NewProxy<T>() where T : class
        {
            return NamingContext.ModelContext.NewProxy<T>();
        }

        public static ProxyModel<T> NewProxy<T>(string ModelName) where T : class
        {
            var Proxy = NewProxy<T>();
            Name(Proxy, ModelName);
            return Proxy;
        }

        public static void Name(ModelBase Model, string ModelName)
        {
            NamingContext.Name(Model, ModelName);
        }

        public static void AsyncCall(Action Action)
        {
            var AppContext = Context;

            Action Wrapper = () =>
            {
                using (new ThreadToApplicationContextAssociation(AppContext))
                    Action();
            };

            Wrapper.BeginInvoke(delegate { }, null);
        }
    }
}